#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@File: Prompt.py
@Author: lijk34925 
@Date: 2025/3/31 14:15
@desc: 请补充本模块功能说明
"""
import requests


def act_prompt(question: str, knowledge: str, history: list) -> str:
    """
    处理用户请求并调用大模型API获取响应

    Args:
        - prompt: 用户输入内容

    Api interface :
        URL	http://10.20.200.121:8090/uis/chat/completions
        header 	Authorization: Bearer  XXXXX' 	// 账号token，参考账号信息

        Request Body：	{	详细模型参数使用说明可以参考openai 官方api
                "frequency_penalty": 0.0,
                "messages": [
                    {
                        "content": "你是通义千问哪个版本的",	// 用户输入的问题内容
                        "role": "user"
                    }
                ],
                "max_tokens":200,	// 最大生成token长度
                "model": "Qwen2-72B-Instruct",	// 模型名称
                "n": 1,
                "presence_penalty": 0.0,
                "stream": false,
                "temperature": 0.2,	// 温度
                "top_p": 1.0,
            user": "zhangs44444"  	// 使用人域账号
            }

        Response Body：	{
                "id": "chat-b01a44b8bece4de8bff82b5a32527b15",
                "object": "chat.completion",
                "created": 1724308924,
                "model": "Qwen2-72B-Instruct",
                "choices": [
                    {
                        "index": 0,
                        "message": {
                            "role": "assistant",
                            "content": "我现在的名称是通义千问，是阿里云研发的大规模语言模型。目前我处于预览版阶段，后续会不断迭代和升级，提供更好的服务和体验。",		// 模型响应结果
                            "tool_calls": []
                        },
                        "logprobs": null,
                        "finish_reason": "stop",
                        "stop_reason": null
                    }
                ],
                "usage": {		// token 使用情况
                    "prompt_tokens": 27,
                    "total_tokens": 67,
                    "completion_tokens": 40
                }
            }

    Returns:
        包含响应结果的字典，格式为 {"response": "模型输出内容"}
        或错误时返回 {"response": "错误描述"}
    """

    # 配置参数（建议改为从环境变量读取）
    MODEL_API_URL = "http://10.20.200.121:8080/uis/chat/completions"
    AUTH_TOKEN = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTRi16aWRvbmdodWEiLCJpYXQiOjE3MzkzMzAzMzR9.D8k8JnfOfinhF-PRNCdL0LewMYRGpTzgkwvDn_R24rI"



    # 参数验证
    if len(question) == 0:
        return "缺少必要参数: prompt"

    # 设置系统角色，提供prompt模板
    def __get_system_prompt(content: str):
        prompt_content = (
            f"**角色设定：** 你是金融互联网行业的金融反洗钱系统测试助手，请以一个资深测试工程师的身份来解答测试同学所提出关于反洗钱系统的问题"
            f"（包括但不限于测试环境部署、环境问题解决、测试方法、测试指导、问题解决等)。\r\n"
            f"**建议思考方法：** （1）根据用户输入的问题，优先从测试和研发团队积累的知识库提取相关问题的解答方法；\r\n"
            f"                 （2）结合金融行业软件系统的相关知识和软件测试经验，推导输出解决方案；\r\n"
            f"                 （3）若用户问题超出知识库文档返回，请根据网络资料和你的历史积累来解决方案.\r\n"
            f"**返回要求：** 将返回结果进行归纳总结，有条理、有逻辑顺序的逐步骤输出。最终以markdown格式返回输出\r\n"
            f"\r\n### ====以下是从知识库检索到的相关信息:====\r\n "
            f"{content}\r\n"
            f"### ====以上是从知识库检索到的相关信息====\r\n")
        return prompt_content

    # 调用大模型，获取问答结果
    def __chat_round(msg: list) -> str:
        payload = {
            "frequency_penalty": 0.0,
            "messages": msg,
            "max_tokens": 4096,
            "model": "Qwen2-72B-Instruct",
            "n": 1,
            "presence_penalty": 0.0,
            "stream": False,
            "temperature": 0.2,
            "top_p": 1.0,
            "user": "lijk34925"
        }

        try:
            # 发送请求（添加超时和重试逻辑）
            response = requests.post(
                MODEL_API_URL,
                json=payload,
                headers={"content-type": "application/json", "Authorization": AUTH_TOKEN},
                timeout=100  # 设置10秒超时
            )
            response.raise_for_status()  # 检查HTTP状态码

            # 解析响应
            result = response.json()
            if not isinstance(result, dict) or "choices" not in result:
                return "无效的API响应格式"

            answer = result.get("choices", [{}])[0].get("message", {}).get("content", "")
            return answer

        except requests.exceptions.RequestException as e:
            return f"网络请求失败: {str(e)}"
        except (ValueError, KeyError) as e:
            return f"数据处理错误: {str(e)}"
        except Exception as e:
            return f"未知错误: {str(e)}"

    # 处理历史消息
    def __get_history_news(his_msg:list) -> list:
        old_news = []
        if not his_msg:
            return old_news
        if len(his_msg) > 3:
            his_msg = his_msg[-3:]
        for unit in his_msg:
            question = {"role": "user", "content": unit.get("question")}
            answer = {"role": "assistant", "content": unit.get("answer")}
            old_news.append(question)
            old_news.append(answer)
        return old_news

    message = []
    # 设置系统角色
    system_prompt = {"content": __get_system_prompt(knowledge), "role": "system"}
    message.append(system_prompt)
    # 添加历史消息
    his_news = __get_history_news(history)
    if his_news:
        message.extend(his_news)
    # 追加本轮信息
    message.append({"content": f"**用户问题：** {question}","role": "user"})
    return __chat_round(message)


if __name__ == '__main__':
    print(act_prompt("反洗钱系统，服务部署顺序是什么？", "反洗钱系统测试", []))